Laboratório R 01¶
Aluno Wesley Rodrigues
Curso Mestrado em Computação Aplicada
Turma T06
Disciplina Big Data & Analitycs
Atividade Laboratório R 01
Data 10/OUT/2023
As atividades propostas em sala tem como objetivo familiarizar o aluno com as operações comuns em análise de conjuntos de dados. Esta atividade foi realizada em Python, que foi colocado como alternativa ao R.

# Nesta seção as bibliotecas necessárias para o funcionamento do código são importadas
import math
import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
12 + (16 - 7) * 7 - 8/4
73.0
e = math.e
pi = math.pi
ln = math.log
((e ** (6/2)) - 3 ** (1/2)) / (pi * (23 ** (1/5))) + ln(15)
5.8285425904692705
sin = math.sin
cos = math.cos
log = math.log
sin(51) + cos(6) + log(7, 3)
3.4016432116551627
2. Multiplique a sua idade por meses e salve o resultado em um objeto chamado idade_em_meses.¶
Em seguida, multiplique esse objeto por 30 e salve o resultado em um objeto chamado idade_em_dias.
idade = 37
idade_em_meses = idade * 12
idade_em_dias = idade_em_meses * 30
3. Guarde em um objeto chamado nome uma string contendo o seu nome completo.¶
nome = 'Wesley Rodrigues da Silva'
print('Olá,', nome)
print(f'Você tem {idade} anos, que equivalem a {idade_em_meses} meses ou {idade_em_dias} dias')
Olá, Wesley Rodrigues da Silva Você tem 37 anos, que equivalem a 444 meses ou 13320 dias
4. Qual é a soma dos números de 101 a 1000?¶
sum(range(101, 1000 + 1))
495450
5. Quantos algarismos possui o resultado do produto dos números de 1 a 12?¶
resultado = math.prod((range(1, 12 + 1)))
print(f'O número {resultado} possui {len(str(resultado))} algarismos.')
O número 479001600 possui 9 algarismos.
6. Use o vetor números abaixo para responder as questões seguintes.¶
numeros <- -4:2
a) Escreva um código que devolva apenas valores positivos do vetor numeros.
b) Escreva um código que de volta apenas os valores pares do vetor numeros.
c) Filtre o vetor para que retorne apenas aqueles valores que, quando elevados a 2, são menores que 4.
numeros = list(range(-4, 2 + 1))
print('Vetor de números:', numeros)
resposta_a = list(filter(lambda x: x >= 0, numeros))
print('Resposta a:', resposta_a)
resposta_b = list(filter(lambda x: x % 2 == 0, numeros))
print('Resposta b:', resposta_b)
resposta_c = list(filter(lambda x: x ** 2 > 4, numeros))
print('Resposta c:', resposta_c)
Vetor de números: [-4, -3, -2, -1, 0, 1, 2] Resposta a: [0, 1, 2] Resposta b: [-4, -2, 0, 2] Resposta c: [-4, -3]
7. Quais as diferenças entre NaN, NULL, NA e Inf? Digite expressões que retornem cada um desses valores.¶
NaN significa not a number, ou seja, não é um número.
NULL é um valor indefinido. Ocorre, por exemplo, quando uma propriedade de um objeto não é definida.
NA significa not available e geralmente é usado quando dados estão faltando. Ocorre ao importar dados com valores ausentes.
Inf e -Inf são infinitos. Ocorrem por exemplo na divisão por zero.
8. Carregue o conjunto de dados airquality com o comando data(airquality) para responder às questões abaixo.¶
a) Conte quantos NAs tem na coluna Solar.R.
b) Filtre a tabela airquality com apenas linhas em que Solar.R é NA.
c) Filtre a tabela airquality com apenas linhas em que Solar.R não é NA.
d) Filtre a tabela airquality com apenas linhas em que Solar.R não é NA e Month é igual a 5.
df = pd.read_csv('./datasets/airquality.csv')
df.head()
| rownames | Ozone | Solar.R | Wind | Temp | Month | Day | |
|---|---|---|---|---|---|---|---|
| 0 | 1 | 41.0 | 190.0 | 7.4 | 67 | 5 | 1 |
| 1 | 2 | 36.0 | 118.0 | 8.0 | 72 | 5 | 2 |
| 2 | 3 | 12.0 | 149.0 | 12.6 | 74 | 5 | 3 |
| 3 | 4 | 18.0 | 313.0 | 11.5 | 62 | 5 | 4 |
| 4 | 5 | NaN | NaN | 14.3 | 56 | 5 | 5 |
resposta_a = sum(df['Solar.R'].isna())
print('Resposta a:', resposta_a)
Resposta a: 7
resposta_b = df[df['Solar.R'].isna()]
print('Resposta b:')
resposta_b
Resposta b:
| rownames | Ozone | Solar.R | Wind | Temp | Month | Day | |
|---|---|---|---|---|---|---|---|
| 4 | 5 | NaN | NaN | 14.3 | 56 | 5 | 5 |
| 5 | 6 | 28.0 | NaN | 14.9 | 66 | 5 | 6 |
| 10 | 11 | 7.0 | NaN | 6.9 | 74 | 5 | 11 |
| 26 | 27 | NaN | NaN | 8.0 | 57 | 5 | 27 |
| 95 | 96 | 78.0 | NaN | 6.9 | 86 | 8 | 4 |
| 96 | 97 | 35.0 | NaN | 7.4 | 85 | 8 | 5 |
| 97 | 98 | 66.0 | NaN | 4.6 | 87 | 8 | 6 |
resposta_c = df.query('`Solar.R`.isna() == False & Month == 5')
print('Resposta c:')
resposta_c
Resposta c:
| rownames | Ozone | Solar.R | Wind | Temp | Month | Day | |
|---|---|---|---|---|---|---|---|
| 0 | 1 | 41.0 | 190.0 | 7.4 | 67 | 5 | 1 |
| 1 | 2 | 36.0 | 118.0 | 8.0 | 72 | 5 | 2 |
| 2 | 3 | 12.0 | 149.0 | 12.6 | 74 | 5 | 3 |
| 3 | 4 | 18.0 | 313.0 | 11.5 | 62 | 5 | 4 |
| 6 | 7 | 23.0 | 299.0 | 8.6 | 65 | 5 | 7 |
| 7 | 8 | 19.0 | 99.0 | 13.8 | 59 | 5 | 8 |
| 8 | 9 | 8.0 | 19.0 | 20.1 | 61 | 5 | 9 |
| 9 | 10 | NaN | 194.0 | 8.6 | 69 | 5 | 10 |
| 11 | 12 | 16.0 | 256.0 | 9.7 | 69 | 5 | 12 |
| 12 | 13 | 11.0 | 290.0 | 9.2 | 66 | 5 | 13 |
| 13 | 14 | 14.0 | 274.0 | 10.9 | 68 | 5 | 14 |
| 14 | 15 | 18.0 | 65.0 | 13.2 | 58 | 5 | 15 |
| 15 | 16 | 14.0 | 334.0 | 11.5 | 64 | 5 | 16 |
| 16 | 17 | 34.0 | 307.0 | 12.0 | 66 | 5 | 17 |
| 17 | 18 | 6.0 | 78.0 | 18.4 | 57 | 5 | 18 |
| 18 | 19 | 30.0 | 322.0 | 11.5 | 68 | 5 | 19 |
| 19 | 20 | 11.0 | 44.0 | 9.7 | 62 | 5 | 20 |
| 20 | 21 | 1.0 | 8.0 | 9.7 | 59 | 5 | 21 |
| 21 | 22 | 11.0 | 320.0 | 16.6 | 73 | 5 | 22 |
| 22 | 23 | 4.0 | 25.0 | 9.7 | 61 | 5 | 23 |
| 23 | 24 | 32.0 | 92.0 | 12.0 | 61 | 5 | 24 |
| 24 | 25 | NaN | 66.0 | 16.6 | 57 | 5 | 25 |
| 25 | 26 | NaN | 266.0 | 14.9 | 58 | 5 | 26 |
| 27 | 28 | 23.0 | 13.0 | 12.0 | 67 | 5 | 28 |
| 28 | 29 | 45.0 | 252.0 | 14.9 | 81 | 5 | 29 |
| 29 | 30 | 115.0 | 223.0 | 5.7 | 79 | 5 | 30 |
| 30 | 31 | 37.0 | 279.0 | 7.4 | 76 | 5 | 31 |
BLOCO 2: Análise descritiva de dados¶
1. Carregue o conjunto de dados USArrests com o comando data(USArrests).¶
Examine a sua documentação com help(USArrests) e responda as perguntas a seguir.
a. qual o número médio e mediano de cada um dos crimes?
b. encontre a mediana e quartis para cada crime.
c. encontre o número máximo e mínimo para cada crime.
d. faça um gráfico adequado para o número de assassinatos (murder).
e. verifique se há correlação entre os diferentes tipos de crime.
f. verifique se há correlação entre os crimes e a proporção de população urbana.
g. encontre os estados com maior e menor ocorrência de cada tipo de crime.
h. encontre os estados com maior e menor ocorrência per capta de cada tipo de crime.
i. encontre os estados com maior e menor ocorrência do total de crimes.
df = pd.read_csv('./datasets/USArrests.csv')
df.sample(10)
| rownames | Murder | Assault | UrbanPop | Rape | |
|---|---|---|---|---|---|
| 21 | Michigan | 12.1 | 255 | 74 | 35.1 |
| 48 | Wisconsin | 2.6 | 53 | 66 | 10.8 |
| 26 | Nebraska | 4.3 | 102 | 62 | 16.5 |
| 22 | Minnesota | 2.7 | 72 | 66 | 14.9 |
| 35 | Oklahoma | 6.6 | 151 | 68 | 20.0 |
| 37 | Pennsylvania | 6.3 | 106 | 72 | 14.9 |
| 31 | New York | 11.1 | 254 | 86 | 26.1 |
| 2 | Arizona | 8.1 | 294 | 80 | 31.0 |
| 11 | Idaho | 2.6 | 120 | 54 | 14.2 |
| 23 | Mississippi | 16.1 | 259 | 44 | 17.1 |
crimes = ['Murder', 'Assault', 'Rape']
print('Média, mediana e quartis dos crimes: (exercícios a, b e c)')
df[crimes].describe()
Média, mediana e quartis dos crimes: (exercícios a, b e c)
| Murder | Assault | Rape | |
|---|---|---|---|
| count | 50.00000 | 50.000000 | 50.000000 |
| mean | 7.78800 | 170.760000 | 21.232000 |
| std | 4.35551 | 83.337661 | 9.366385 |
| min | 0.80000 | 45.000000 | 7.300000 |
| 25% | 4.07500 | 109.000000 | 15.075000 |
| 50% | 7.25000 | 159.000000 | 20.100000 |
| 75% | 11.25000 | 249.000000 | 26.175000 |
| max | 17.40000 | 337.000000 | 46.000000 |
px.box(df[crimes], height=600)
# d. faça um gráfico adequado para o número de assassinatos (murder).
fig = px.bar(df.sort_values(ascending=False, by='Murder'), x='rownames', y='Murder', height=600)
fig.show()
# e. verifique se há correlação entre os diferentes tipos de crime.
df[crimes].corr()
| Murder | Assault | Rape | |
|---|---|---|---|
| Murder | 1.000000 | 0.801873 | 0.563579 |
| Assault | 0.801873 | 1.000000 | 0.665241 |
| Rape | 0.563579 | 0.665241 | 1.000000 |
px.imshow(df[crimes].corr(), text_auto=True, title='Mapa de Calor da Correlação entre Crimes', height=600)
# f. verifique se há correlação entre os crimes e a proporção de população urbana.
df[['Murder', 'Assault', 'Rape','UrbanPop']].corr()
| Murder | Assault | Rape | UrbanPop | |
|---|---|---|---|---|
| Murder | 1.000000 | 0.801873 | 0.563579 | 0.069573 |
| Assault | 0.801873 | 1.000000 | 0.665241 | 0.258872 |
| Rape | 0.563579 | 0.665241 | 1.000000 | 0.411341 |
| UrbanPop | 0.069573 | 0.258872 | 0.411341 | 1.000000 |
px.imshow(df[['Murder', 'Assault', 'Rape','UrbanPop']].corr(), text_auto=True, title='Mapa de Calor da Correlação entre Crimes e População', height=600)
# g. encontre os estados com maior e menor ocorrência de cada tipo de crime.
print('Top 5 estados com mais assassinatos:')
df.sort_values(by='Murder', ascending=False)[:5]
Top 5 estados com mais assassinatos:
| rownames | Murder | Assault | UrbanPop | Rape | |
|---|---|---|---|---|---|
| 9 | Georgia | 17.4 | 211 | 60 | 25.8 |
| 23 | Mississippi | 16.1 | 259 | 44 | 17.1 |
| 8 | Florida | 15.4 | 335 | 80 | 31.9 |
| 17 | Louisiana | 15.4 | 249 | 66 | 22.2 |
| 39 | South Carolina | 14.4 | 279 | 48 | 22.5 |
print('Top 5 estados com menos assassinatos:')
df.sort_values(by='Murder', ascending=True)[:5]
Top 5 estados com menos assassinatos:
| rownames | Murder | Assault | UrbanPop | Rape | |
|---|---|---|---|---|---|
| 33 | North Dakota | 0.8 | 45 | 44 | 7.3 |
| 28 | New Hampshire | 2.1 | 57 | 56 | 9.5 |
| 18 | Maine | 2.1 | 83 | 51 | 7.8 |
| 14 | Iowa | 2.2 | 56 | 57 | 11.3 |
| 44 | Vermont | 2.2 | 48 | 32 | 11.2 |
print('Top 5 estados com mais assaltos:')
df.sort_values(by='Assault', ascending=False)[:5]
Top 5 estados com mais assaltos:
| rownames | Murder | Assault | UrbanPop | Rape | |
|---|---|---|---|---|---|
| 32 | North Carolina | 13.0 | 337 | 45 | 16.1 |
| 8 | Florida | 15.4 | 335 | 80 | 31.9 |
| 19 | Maryland | 11.3 | 300 | 67 | 27.8 |
| 2 | Arizona | 8.1 | 294 | 80 | 31.0 |
| 30 | New Mexico | 11.4 | 285 | 70 | 32.1 |
print('Top 5 estados com menos assaltos:')
df.sort_values(by='Assault', ascending=True)[:5]
Top 5 estados com menos assaltos:
| rownames | Murder | Assault | UrbanPop | Rape | |
|---|---|---|---|---|---|
| 33 | North Dakota | 0.8 | 45 | 44 | 7.3 |
| 10 | Hawaii | 5.3 | 46 | 83 | 20.2 |
| 44 | Vermont | 2.2 | 48 | 32 | 11.2 |
| 48 | Wisconsin | 2.6 | 53 | 66 | 10.8 |
| 14 | Iowa | 2.2 | 56 | 57 | 11.3 |
print('Top 5 estados com mais estupros:')
df.sort_values(by='Rape', ascending=False)[:5]
Top 5 estados com mais estupros:
| rownames | Murder | Assault | UrbanPop | Rape | |
|---|---|---|---|---|---|
| 27 | Nevada | 12.2 | 252 | 81 | 46.0 |
| 1 | Alaska | 10.0 | 263 | 48 | 44.5 |
| 4 | California | 9.0 | 276 | 91 | 40.6 |
| 5 | Colorado | 7.9 | 204 | 78 | 38.7 |
| 21 | Michigan | 12.1 | 255 | 74 | 35.1 |
print('Top 5 estados com menos estupros:')
df.sort_values(by='Rape', ascending=True)[:5]
Top 5 estados com menos estupros:
| rownames | Murder | Assault | UrbanPop | Rape | |
|---|---|---|---|---|---|
| 33 | North Dakota | 0.8 | 45 | 44 | 7.3 |
| 18 | Maine | 2.1 | 83 | 51 | 7.8 |
| 38 | Rhode Island | 3.4 | 174 | 87 | 8.3 |
| 47 | West Virginia | 5.7 | 81 | 39 | 9.3 |
| 28 | New Hampshire | 2.1 | 57 | 56 | 9.5 |
# h. encontre os estados com maior e menor ocorrência per capta de cada tipo de crime.
df['MurderPC'] = df['Murder'] / df['UrbanPop']
print('Top 5 estados com mais assassinatos per capita:')
df.sort_values(by='MurderPC', ascending=False)[:5]
Top 5 estados com mais assassinatos per capita:
| rownames | Murder | Assault | UrbanPop | Rape | MurderPC | |
|---|---|---|---|---|---|---|
| 23 | Mississippi | 16.1 | 259 | 44 | 17.1 | 0.365909 |
| 39 | South Carolina | 14.4 | 279 | 48 | 22.5 | 0.300000 |
| 9 | Georgia | 17.4 | 211 | 60 | 25.8 | 0.290000 |
| 32 | North Carolina | 13.0 | 337 | 45 | 16.1 | 0.288889 |
| 17 | Louisiana | 15.4 | 249 | 66 | 22.2 | 0.233333 |
print('Top 5 estados com menos assassinatos per capita:')
df.sort_values(by='MurderPC', ascending=True)[:5]
Top 5 estados com menos assassinatos per capita:
| rownames | Murder | Assault | UrbanPop | Rape | MurderPC | |
|---|---|---|---|---|---|---|
| 33 | North Dakota | 0.8 | 45 | 44 | 7.3 | 0.018182 |
| 28 | New Hampshire | 2.1 | 57 | 56 | 9.5 | 0.037500 |
| 14 | Iowa | 2.2 | 56 | 57 | 11.3 | 0.038596 |
| 38 | Rhode Island | 3.4 | 174 | 87 | 8.3 | 0.039080 |
| 48 | Wisconsin | 2.6 | 53 | 66 | 10.8 | 0.039394 |
df['AssaultPC'] = df['Assault'] / df['UrbanPop']
print('Top 5 estados com mais assaltos per capita:')
df.sort_values(by='AssaultPC', ascending=False)[:5]
Top 5 estados com mais assaltos per capita:
| rownames | Murder | Assault | UrbanPop | Rape | MurderPC | AssaultPC | |
|---|---|---|---|---|---|---|---|
| 32 | North Carolina | 13.0 | 337 | 45 | 16.1 | 0.288889 | 7.488889 |
| 23 | Mississippi | 16.1 | 259 | 44 | 17.1 | 0.365909 | 5.886364 |
| 39 | South Carolina | 14.4 | 279 | 48 | 22.5 | 0.300000 | 5.812500 |
| 1 | Alaska | 10.0 | 263 | 48 | 44.5 | 0.208333 | 5.479167 |
| 19 | Maryland | 11.3 | 300 | 67 | 27.8 | 0.168657 | 4.477612 |
print('Top 5 estados com menos assaltos per capita:')
df.sort_values(by='AssaultPC', ascending=True)[:5]
Top 5 estados com menos assaltos per capita:
| rownames | Murder | Assault | UrbanPop | Rape | MurderPC | AssaultPC | |
|---|---|---|---|---|---|---|---|
| 10 | Hawaii | 5.3 | 46 | 83 | 20.2 | 0.063855 | 0.554217 |
| 48 | Wisconsin | 2.6 | 53 | 66 | 10.8 | 0.039394 | 0.803030 |
| 14 | Iowa | 2.2 | 56 | 57 | 11.3 | 0.038596 | 0.982456 |
| 28 | New Hampshire | 2.1 | 57 | 56 | 9.5 | 0.037500 | 1.017857 |
| 33 | North Dakota | 0.8 | 45 | 44 | 7.3 | 0.018182 | 1.022727 |
df['RapePC'] = df['Rape'] / df['UrbanPop']
print('Top 5 estados com mais estupros per capita:')
df.sort_values(by='RapePC', ascending=False)[:5]
Top 5 estados com mais estupros per capita:
| rownames | Murder | Assault | UrbanPop | Rape | MurderPC | AssaultPC | RapePC | |
|---|---|---|---|---|---|---|---|---|
| 1 | Alaska | 10.0 | 263 | 48 | 44.5 | 0.208333 | 5.479167 | 0.927083 |
| 27 | Nevada | 12.2 | 252 | 81 | 46.0 | 0.150617 | 3.111111 | 0.567901 |
| 5 | Colorado | 7.9 | 204 | 78 | 38.7 | 0.101282 | 2.615385 | 0.496154 |
| 21 | Michigan | 12.1 | 255 | 74 | 35.1 | 0.163514 | 3.445946 | 0.474324 |
| 39 | South Carolina | 14.4 | 279 | 48 | 22.5 | 0.300000 | 5.812500 | 0.468750 |
print('Top 5 estados com menos estupros per capita:')
df.sort_values(by='RapePC', ascending=True)[:5]
Top 5 estados com menos estupros per capita:
| rownames | Murder | Assault | UrbanPop | Rape | MurderPC | AssaultPC | RapePC | |
|---|---|---|---|---|---|---|---|---|
| 38 | Rhode Island | 3.4 | 174 | 87 | 8.3 | 0.039080 | 2.000000 | 0.095402 |
| 6 | Connecticut | 3.3 | 110 | 77 | 11.1 | 0.042857 | 1.428571 | 0.144156 |
| 18 | Maine | 2.1 | 83 | 51 | 7.8 | 0.041176 | 1.627451 | 0.152941 |
| 48 | Wisconsin | 2.6 | 53 | 66 | 10.8 | 0.039394 | 0.803030 | 0.163636 |
| 33 | North Dakota | 0.8 | 45 | 44 | 7.3 | 0.018182 | 1.022727 | 0.165909 |
# i. encontre os estados com maior e menor ocorrência do total de crimes.
df['Crimes'] = df['Murder'] + df['Assault'] + df['Rape']
print('Top 5 estados com mais crimes somados (assassinatos, assaltos e estupros):')
df.sort_values(by='Crimes', ascending=False)[:5]
Top 5 estados com mais crimes somados (assassinatos, assaltos e estupros):
| rownames | Murder | Assault | UrbanPop | Rape | MurderPC | AssaultPC | RapePC | Crimes | |
|---|---|---|---|---|---|---|---|---|---|
| 8 | Florida | 15.4 | 335 | 80 | 31.9 | 0.192500 | 4.187500 | 0.398750 | 382.3 |
| 32 | North Carolina | 13.0 | 337 | 45 | 16.1 | 0.288889 | 7.488889 | 0.357778 | 366.1 |
| 19 | Maryland | 11.3 | 300 | 67 | 27.8 | 0.168657 | 4.477612 | 0.414925 | 339.1 |
| 2 | Arizona | 8.1 | 294 | 80 | 31.0 | 0.101250 | 3.675000 | 0.387500 | 333.1 |
| 30 | New Mexico | 11.4 | 285 | 70 | 32.1 | 0.162857 | 4.071429 | 0.458571 | 328.5 |
print('Top 5 estados com menos crimes somados (assassinatos, assaltos e estupros):')
df.sort_values(by='Crimes', ascending=True)[:5]
Top 5 estados com menos crimes somados (assassinatos, assaltos e estupros):
| rownames | Murder | Assault | UrbanPop | Rape | MurderPC | AssaultPC | RapePC | Crimes | |
|---|---|---|---|---|---|---|---|---|---|
| 33 | North Dakota | 0.8 | 45 | 44 | 7.3 | 0.018182 | 1.022727 | 0.165909 | 53.1 |
| 44 | Vermont | 2.2 | 48 | 32 | 11.2 | 0.068750 | 1.500000 | 0.350000 | 61.4 |
| 48 | Wisconsin | 2.6 | 53 | 66 | 10.8 | 0.039394 | 0.803030 | 0.163636 | 66.4 |
| 28 | New Hampshire | 2.1 | 57 | 56 | 9.5 | 0.037500 | 1.017857 | 0.169643 | 68.6 |
| 14 | Iowa | 2.2 | 56 | 57 | 11.3 | 0.038596 | 0.982456 | 0.198246 | 69.5 |
2. Para resolver os exercícios a seguir, utilize a base imdb. Essa base pode ser baixada clicando aqui. Uma vez baixada, o comando para ler a base é apresentado a seguir:¶
install.packages("readr")
imdb <- readr::read_rds("caminho_do_arquivo/imdb.rds")
imdb
OBS: para saber qual é o diretório atual do seu projeto e trocá-lo, caso ache necessário, utilize as funções getwd() e setwd(“caminho_do_novo_diretorio”).
a. Crie um gráfico de dispersão da nota do imdb pelo orçamento.
b. Faça um gráfico de linhas do orçamento médio dos filmes ao longo dos anos.
c. Transforme o gráfico do exercício anterior em um gráfico de barras.
d. Descubra quais são os 5 atores que mais aparecem na coluna ator_1 e faça um boxplot do lucro dos filmes desses atores.
e. Resolva os itens a seguir para fazer um gráfico de barras da frequência de filmes com nota maior que 8 ao longo dos anos.
i. Crie uma nova coluna na base IMDB indicando se a nota de um filme é maior que 8 ou não.
ii. Utilizando a coluna criada em (i) crie uma tabela com o número anual de filmes com nota maior 8.
iii. Utilize a tabela criada em (ii) para fazer um gráfico de barras do número de filmes com nota maior que 8 ao longo dos anos.
f. Represente as mesmas informações do item e com um gráfico de pizza.
df = pd.read_csv('./datasets/imdb.csv', sep=';')
df.sample(10)
| titulo | ano | diretor | duracao | cor | generos | pais | classificacao | orcamento | receita | nota_imdb | likes_facebook | ator_1 | ator_2 | ator_3 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 955 | The Pledge | 2001.0 | Sean Penn | 124.0 | Color | Crime|Drama|Mystery|Thriller | USA | A partir de 18 anos | 45000000.0 | 19719930.0 | 6,8 | 0 | Costas Mandylor | Adrien Dorval | Nels Lennarson |
| 835 | The Book of Life | 2014.0 | Jorge R. Gutiérrez | 95.0 | Color | Adventure|Animation|Comedy|Family|Fantasy|Romance | USA | Livre | 50000000.0 | 50150619.0 | 7,3 | 18000 | Channing Tatum | Hector Elizondo | Ana de la Reguera |
| 2697 | Friends with Money | 2006.0 | Nicole Holofcener | 88.0 | Color | Comedy|Drama|Romance | USA | A partir de 18 anos | 6500000.0 | 13367101.0 | 5,9 | 515 | Greg Germann | Marin Hinkle | Jake Cherry |
| 3217 | Beasts of the Southern Wild | 2012.0 | Benh Zeitlin | 93.0 | Color | Drama|Fantasy | USA | A partir de 13 anos | 1800000.0 | 12784397.0 | 7,3 | 31000 | Quvenzhané Wallis | Gina Montana | Dwight Henry |
| 2091 | Diary of a Wimpy Kid | 2010.0 | Thor Freudenthal | 94.0 | Color | Comedy|Family | USA | Livre | 15000000.0 | 64001297.0 | 6,2 | 0 | Chloë Grace Moretz | Zachary Gordon | Rachael Harris |
| 1643 | Without Limits | 1998.0 | Robert Towne | 117.0 | Color | Biography|Drama|Sport | USA | A partir de 13 anos | 25000000.0 | 777423.0 | 7,2 | 942 | Billy Burke | Monica Potter | Billy Crudup |
| 2862 | Rudderless | 2014.0 | William H. Macy | 105.0 | Color | Comedy|Drama|Music | USA | A partir de 18 anos | 5000000.0 | 37440.0 | 7,5 | 0 | Billy Crudup | Felicity Huffman | David Adam Flannery |
| 11 | Man of Steel | 2013.0 | Zack Snyder | 143.0 | Color | Action|Adventure|Fantasy|Sci-Fi | USA | A partir de 13 anos | 225000000.0 | 291021565.0 | 7,2 | 118000 | Henry Cavill | Christopher Meloni | Harry Lennix |
| 2076 | Madison | 2001.0 | William Bindley | 94.0 | Color | Drama|Sport | USA | Livre | NaN | 508867.0 | 6,5 | 282 | Bruce Dern | Jake Lloyd | William Shockley |
| 2890 | Spun | 2002.0 | Jonas Åkerlund | 106.0 | Color | Comedy|Crime|Drama | USA | A partir de 18 anos | 2000000.0 | 410241.0 | 6,8 | 3000 | Patrick Fugit | Nicholas Gonzalez | Debbie Harry |
# a. Crie um gráfico de dispersão da nota do imdb pelo orçamento.
px.scatter(df.sort_values(by='nota_imdb'), x='orcamento', y='nota_imdb', height=600)
# b. Faça um gráfico de linhas do orçamento médio dos filmes ao longo dos anos.
orcamento_medio_ano = df[['ano', 'orcamento']].groupby(by='ano').mean()
orcamento_medio_ano
| orcamento | |
|---|---|
| ano | |
| 1916.0 | 3.859070e+05 |
| 1920.0 | 1.000000e+05 |
| 1925.0 | 2.450000e+05 |
| 1929.0 | 3.790000e+05 |
| 1930.0 | 3.950000e+06 |
| ... | ... |
| 2012.0 | 4.311197e+07 |
| 2013.0 | 4.647931e+07 |
| 2014.0 | 3.650454e+07 |
| 2015.0 | 3.625789e+07 |
| 2016.0 | 5.746343e+07 |
90 rows × 1 columns
px.line(orcamento_medio_ano, height=600)
# c. Transforme o gráfico do exercício anterior em um gráfico de barras.
px.bar(orcamento_medio_ano, height=600)
# d. Descubra quais são os 5 atores que mais aparecem na coluna ator_1 e faça um boxplot do lucro dos filmes desses atores.
df['lucro'] = df['receita'] - df['orcamento']
top_atores = df['ator_1'].value_counts(ascending=False)[:5]
top_atores
Robert De Niro 41 Johnny Depp 31 J.K. Simmons 29 Nicolas Cage 28 Denzel Washington 28 Name: ator_1, dtype: int64
df_top_atores = df.query('ator_1 in @top_atores.keys()')
df_top_atores
| titulo | ano | diretor | duracao | cor | generos | pais | classificacao | orcamento | receita | nota_imdb | likes_facebook | ator_1 | ator_2 | ator_3 | lucro | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Pirates of the Caribbean: At World's End | 2007.0 | Gore Verbinski | 169.0 | Color | Action|Adventure|Fantasy | USA | A partir de 13 anos | 300000000.0 | 309404152.0 | 7,1 | 0 | Johnny Depp | Orlando Bloom | Jack Davenport | 9404152.0 |
| 4 | Spider-Man 3 | 2007.0 | Sam Raimi | 156.0 | Color | Action|Adventure|Romance | USA | A partir de 13 anos | 258000000.0 | 336530303.0 | 6,2 | 0 | J.K. Simmons | James Franco | Kirsten Dunst | 78530303.0 |
| 9 | Pirates of the Caribbean: Dead Man's Chest | 2006.0 | Gore Verbinski | 151.0 | Color | Action|Adventure|Fantasy | USA | A partir de 13 anos | 225000000.0 | 423032628.0 | 7,3 | 5000 | Johnny Depp | Orlando Bloom | Jack Davenport | 198032628.0 |
| 10 | The Lone Ranger | 2013.0 | Gore Verbinski | 150.0 | Color | Action|Adventure|Western | USA | A partir de 13 anos | 215000000.0 | 89289910.0 | 6,5 | 48000 | Johnny Depp | Ruth Wilson | Tom Wilkinson | -125710090.0 |
| 14 | Pirates of the Caribbean: On Stranger Tides | 2011.0 | Rob Marshall | 136.0 | Color | Action|Adventure|Fantasy | USA | A partir de 13 anos | 250000000.0 | 241063875.0 | 6,7 | 58000 | Johnny Depp | Sam Claflin | Stephen Graham | -8936125.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2941 | Joe | 2013.0 | David Gordon Green | 117.0 | Color | Drama | USA | A partir de 18 anos | 4000000.0 | 371897.0 | 6,9 | 11000 | Nicolas Cage | Tye Sheridan | Ronnie Gene Blevins | -3628103.0 |
| 2996 | Whiplash | 2014.0 | Damien Chazelle | 107.0 | Color | Drama|Music | USA | A partir de 18 anos | 3300000.0 | 13092000.0 | 8,5 | 129000 | J.K. Simmons | Melissa Benoist | Chris Mulkey | 9792000.0 |
| 3052 | Tusk | 2014.0 | Kevin Smith | 102.0 | Color | Comedy|Drama|Horror | USA | A partir de 18 anos | 3000000.0 | 1821983.0 | 5,4 | 20000 | Johnny Depp | Haley Joel Osment | Michael Parks | -1178017.0 |
| 3166 | Harsh Times | 2005.0 | David Ayer | 116.0 | Color | Action|Crime|Drama|Thriller | USA | A partir de 18 anos | 2000000.0 | 3335839.0 | 7,0 | 0 | J.K. Simmons | Christian Bale | Noel Gugliemi | 1335839.0 |
| 3332 | Taxi Driver | 1976.0 | Martin Scorsese | 110.0 | Color | Crime|Drama | USA | A partir de 18 anos | 1300000.0 | NaN | 8,3 | 35000 | Robert De Niro | Albert Brooks | Peter Boyle | NaN |
157 rows × 16 columns
px.box(df_top_atores[['ator_1', 'lucro']], x='ator_1', y='lucro', height=600)
# e. Resolva os itens a seguir para fazer um gráfico de barras da frequência de filmes com nota maior que 8 ao longo dos anos.
# i. Crie uma nova coluna na base IMDB indicando se a nota de um filme é maior que 8 ou não.
# ii. Utilizando a coluna criada em (i) crie uma tabela com o número anual de filmes com nota maior 8.
# iii. Utilize a tabela criada em (ii) para fazer um gráfico de barras do número de filmes com nota maior que 8 ao longo dos anos.
df['nota_imdb_num'] = df['nota_imdb'].str.replace(',', '.').astype(float)
maior_que_oito = df['nota_imdb_num'] > 8
# i
df['MaiorQueOito'] = maior_que_oito
df.sample(20)
| titulo | ano | diretor | duracao | cor | generos | pais | classificacao | orcamento | receita | nota_imdb | likes_facebook | ator_1 | ator_2 | ator_3 | lucro | nota_imdb_num | MaiorQueOito | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2776 | Saw II | 2005.0 | Darren Lynn Bousman | 95.0 | Color | Horror|Mystery | USA | A partir de 18 anos | 4000000.0 | 87025093.0 | 6,6 | 0 | Emmanuelle Vaugier | Tony Nappo | Shawnee Smith | 83025093.0 | 6.6 | False |
| 1646 | The Counselor | 2013.0 | Ridley Scott | 138.0 | Color | Crime|Drama|Thriller | USA | A partir de 18 anos | 25000000.0 | 16969390.0 | 5,3 | 24000 | Michael Fassbender | Brad Pitt | Goran Visnjic | -8030610.0 | 5.3 | False |
| 3427 | Harrison Montgomery | 2008.0 | Daniel Davila | 95.0 | Color | Drama | USA | Outros | 850000.0 | NaN | 7,4 | 18 | Martin Landau | Melora Walters | Diane Baker | NaN | 7.4 | False |
| 1241 | Parker | 2013.0 | Taylor Hackford | 118.0 | Color | Action|Crime|Romance|Thriller | USA | A partir de 18 anos | 35000000.0 | 17609982.0 | 6,2 | 17000 | Jason Statham | Clifton Collins Jr. | Wendell Pierce | -17390018.0 | 6.2 | False |
| 3281 | The Dog Lover | 2016.0 | Alex Ranarivelo | 101.0 | Color | Drama | USA | Livre | 2000000.0 | NaN | 4,8 | 724 | Lea Thompson | Christina Moore | Cullen Douglas | NaN | 4.8 | False |
| 1360 | Message in a Bottle | 1999.0 | Luis Mandoki | 131.0 | Color | Drama|Romance | USA | A partir de 13 anos | 55000000.0 | 52799004.0 | 6,1 | 0 | Robin Wright | John Savage | Raphael Sbarge | -2200996.0 | 6.1 | False |
| 2918 | The Cooler | 2003.0 | Wayne Kramer | 101.0 | Color | Crime|Drama|Fantasy|Romance | USA | A partir de 18 anos | 3200000.0 | 8243880.0 | 7,0 | 762 | Estella Warren | Paul Sorvino | Shawn Hatosy | 5043880.0 | 7.0 | False |
| 3365 | Luminarias | 2000.0 | José Luis Valenzuela | 100.0 | Color | Comedy|Romance | USA | A partir de 18 anos | 1000000.0 | 428535.0 | 3,6 | 24 | Cheech Marin | Lupe Ontiveros | Robert Beltran | -571465.0 | 3.6 | False |
| 2888 | Moms' Night Out | 2014.0 | Andrew Erwin | 98.0 | Color | Comedy | USA | Livre | 5000000.0 | 10429707.0 | 5,4 | 0 | Alex Kendrick | Sarah Drew | Patricia Heaton | 5429707.0 | 5.4 | False |
| 502 | Doctor Dolittle | 1998.0 | Betty Thomas | 85.0 | Color | Comedy|Family|Fantasy | USA | A partir de 13 anos | 71500000.0 | 144156464.0 | 5,3 | 694 | Oliver Platt | Raven-Symoné | Peter Boyle | 72656464.0 | 5.3 | False |
| 3035 | Teen Wolf Too | 1987.0 | Christopher Leitch | 95.0 | Color | Comedy|Fantasy | USA | Livre | 3000000.0 | 7888703.0 | 3,2 | 491 | John Astin | Robert Neary | Kim Darby | 4888703.0 | 3.2 | False |
| 2529 | Fiddler on the Roof | 1971.0 | Norman Jewison | 181.0 | Color | Drama|Family|Musical|Romance | USA | Outros | 9000000.0 | 50000000.0 | 8,0 | 0 | Topol | Paul Michael Glaser | Rosalind Harris | 41000000.0 | 8.0 | False |
| 694 | Beyond Borders | 2003.0 | Martin Campbell | 127.0 | Color | Adventure|Drama|Romance|War | USA | A partir de 18 anos | 35000000.0 | 4426297.0 | 6,5 | 0 | Angelina Jolie Pitt | Teri Polo | Noah Emmerich | -30573703.0 | 6.5 | False |
| 3501 | Good Kill | 2014.0 | Andrew Niccol | 102.0 | Color | Drama|Thriller | USA | A partir de 18 anos | NaN | 316842.0 | 6,4 | 0 | Bruce Greenwood | Zoë Kravitz | Stafford Douglas | NaN | 6.4 | False |
| 3418 | Latter Days | 2003.0 | C. Jay Cox | 107.0 | Color | Comedy|Drama|Romance | USA | A partir de 18 anos | 850000.0 | 819939.0 | 7,2 | 0 | Joseph Gordon-Levitt | Rob McElhenney | Jacqueline Bisset | -30061.0 | 7.2 | False |
| 2246 | This Christmas | 2007.0 | Preston A. Whitmore II | 117.0 | Color | Comedy|Drama|Romance | USA | A partir de 13 anos | 13000000.0 | 49121934.0 | 6,1 | 0 | Mekhi Phifer | Chris Brown | Loretta Devine | 36121934.0 | 6.1 | False |
| 1878 | A Most Violent Year | 2014.0 | J.C. Chandor | 125.0 | Color | Action|Crime|Drama|Thriller | USA | A partir de 18 anos | 20000000.0 | 5749134.0 | 7,0 | 0 | David Oyelowo | Ashley Williams | Albert Brooks | -14250866.0 | 7.0 | False |
| 2720 | Daddy Day Camp | 2007.0 | Fred Savage | 89.0 | Color | Comedy|Family | USA | Livre | 6000000.0 | 13235267.0 | 2,9 | 256 | Lochlyn Munro | Brian Doyle-Murray | Tamala Jones | 7235267.0 | 2.9 | False |
| 2989 | Batman: The Dark Knight Returns, Part 2 | 2013.0 | Jay Oliva | 148.0 | Color | Action|Animation|Crime|Sci-Fi|Thriller | USA | A partir de 13 anos | 3500000.0 | NaN | 8,4 | 5000 | Michael Emerson | Mark Valley | Grey Griffin | NaN | 8.4 | True |
| 388 | Get Smart | 2008.0 | Peter Segal | 110.0 | Color | Action|Adventure|Comedy | USA | A partir de 13 anos | 80000000.0 | 130313314.0 | 6,5 | 0 | Bill Murray | Dwayne Johnson | Anne Hathaway | 50313314.0 | 6.5 | False |
# ii
tabela_maior_8_por_ano = df[['ano', 'MaiorQueOito']].groupby('ano').sum()
tabela_maior_8_por_ano
| MaiorQueOito | |
|---|---|
| ano | |
| 1916.0 | 0 |
| 1920.0 | 0 |
| 1925.0 | 1 |
| 1929.0 | 0 |
| 1930.0 | 0 |
| ... | ... |
| 2012.0 | 5 |
| 2013.0 | 4 |
| 2014.0 | 9 |
| 2015.0 | 6 |
| 2016.0 | 4 |
90 rows × 1 columns
# iii
px.bar(tabela_maior_8_por_ano, height=600)
# f. Represente as mesmas informações do item e com um gráfico de pizza.
tabela_maior_8_por_ano.plot(kind='pie', y='MaiorQueOito', figsize=(20, 10), legend=False)
<Axes: ylabel='MaiorQueOito'>
# O gráfico tem muitos valores e fica difícil de visualizar. Vamos pegar apenas os anos com 3 ou mais filmes, ou seja, anos de bastante destaque:
tabela_maior_8_por_ano.query('MaiorQueOito >= 3').plot(kind='pie', y='MaiorQueOito', figsize=(20, 10), legend=False)
<Axes: ylabel='MaiorQueOito'>